﻿/***************************************************************
*       
* add by OceanHo 2015/8/26 11:19:55
*
****************************************************************/

using System;
using System.Collections.Generic;
using System.Text;

namespace oceanho.webapi.factory.httpEntity
{
    /// <summary>
    /// 定义一个表示客户端请求对象实体类
    /// </summary>
    [Serializable]
    public class ReqCache
    {
        public ReqCache(string reqID)
        {
            this.reqID = reqID;
            this.req_Warn_Count = 0;
            this.IsPassBadIPValid = false;
        }

        private string reqID = string.Empty;

        /// <summary>
        /// 获取一个值，该值表示请求客户端的请求唯一标识ID
        /// </summary>
        public string ReqID
        {
            get
            {
                return this.reqID;
            }
        }
        /// <summary>
        /// 获取或者设置一个值，该值表示请求客户端的IP地址
        /// </summary>
        public string IP { get; internal set; }

        /// <summary>
        /// 获取一个值，该值表示当前请求的客户端IP地址是否不可用（只读属性，通过 IsPassBadIPValid,Req_Wait_Count，Req_Seconds_Count计算而来）
        /// 如果IsPassBadIPValid为True,此属性永远返回False,否则此属性返回（Req_Wait_Count > AppUtility.Cfg.Allow_Max_Connect || Req_Seconds_Count > AppUtility.Cfg.Allow_Req_Quantity）
        /// </summary>
        public bool IsBadIP
        {
            get
            {
                if (IsPassBadIPValid) return false;
                return (Req_Wait_Count > AppUtility.Cfg.Allow_Max_Connect || Req_Seconds_Count > AppUtility.Cfg.Allow_Req_Quantity);
            }
        }

        /// <summary>
        /// 获取一个值，该值表示当前请求的客户端ReqCache对象，是否不需要验证是否黑名单IP就允许访问
        /// </summary>
        public bool IsPassBadIPValid
        {
            get;
            internal set;
        }

        private int req_Wait_Count = 0;
        /// <summary>
        /// 获取或者设置一个值，该值表示客户端当前没有挂起的请求等待数
        /// </summary>
        public int Req_Wait_Count
        {
            get
            {
                return this.req_Wait_Count;
            }
            internal set
            {
                this.req_Wait_Count = value;
                if (this.req_Wait_Count < 0)
                {
                    this.req_Wait_Count = 0;
                }
            }
        }

        private int req_Seconds_Count = 0;
        /// <summary>
        /// 获取或者设置一个值，该值表示客户端（IP）在统计范围内已经发起过的请求次数
        /// </summary>
        public int Req_Seconds_Count
        {
            get
            {
                return this.req_Seconds_Count;
            }
            internal set
            {
                this.req_Seconds_Count = value;
                if (this.req_Seconds_Count < 0)
                {
                    this.req_Seconds_Count = 0;
                }
            }
        }

        private int req_Warn_Lv = 0;
        /// <summary>
        /// 获取或者设置一个值，该值表示客户端（IP）在统计范围被拉黑的等级（此属性影响解除IP黑名单的时间）,必须>=2
        /// </summary>
        public int Req_Warn_Lv
        {
            get
            {
                return this.req_Warn_Lv;
            }
            internal set
            {
                this.req_Warn_Lv = value;
                if (this.req_Warn_Lv < 2)
                {
                    this.req_Warn_Lv = 2;
                }
            }
        }

        private int req_Warn_Count = 1;
        /// <summary>
        /// 获取或者设置一个值，该值表示客户端（IP）在统计范围被拉黑的次数
        /// </summary>
        public int Req_Warn_Count
        {
            get
            {
                return this.req_Warn_Count;
            }
            internal set
            {
                this.req_Warn_Count = value;
            }
        }

        /// <summary>
        ///  获取或者设置一个值，该值表示客户端IP地址上一次访问的时间
        /// </summary>
        public DateTime Req_Pre_Date { get; set; }

        /// <summary>
        /// 获取或者设置一个值，该值表示此对象在服务器上可以被解除黑名单访问IP的时间
        /// </summary>
        public DateTime Req_Allow_Clear_IsBadIP_Date { get; internal set; }
    }
}
